package cn.iocoder.yudao.framework.business.eligibility.service;

import cn.iocoder.yudao.framework.business.audit.pojo.form.AuditSaveDTO;
import cn.iocoder.yudao.framework.business.basic.service.PageService;
import cn.iocoder.yudao.framework.business.basic.service.SimpleDetailService;
import cn.iocoder.yudao.framework.business.basic.service.UserValidateService;
import cn.iocoder.yudao.framework.business.basic.service.ValidateService;
import cn.iocoder.yudao.framework.business.eligibility.pojo.form.EligibilityApplyQueryDTO;
import cn.iocoder.yudao.framework.business.eligibility.pojo.form.EligibilityApplySaveDTO;
import cn.iocoder.yudao.framework.business.eligibility.pojo.po.EligibilityApplyEntity;
import cn.iocoder.yudao.framework.business.eligibility.pojo.vo.EligibilityApplyCheckVO;
import cn.iocoder.yudao.framework.business.eligibility.pojo.vo.EligibilityApplyVO;
import jakarta.annotation.Nullable;

/**
 * 用户身份资格申请 Service 实现类
 *
 * @author 山野羡民
 */
public interface EligibilityApplyService<DO extends EligibilityApplyEntity, RESP extends EligibilityApplyVO, SAVE extends EligibilityApplySaveDTO, QUERY extends EligibilityApplyQueryDTO> extends ValidateService<DO>, UserValidateService<DO>, SimpleDetailService<RESP>, PageService<RESP, QUERY> {

    /**
     * 校验是否可以创建
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @param reqVO 申请资料
     */
    void validateCanCreate(Long userId, @Nullable Integer userType, SAVE reqVO);

    /**
     * 创建
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @param reqVO 申请资料
     * @return 申请编号
     */
    Long create(Long userId, @Nullable Integer userType, SAVE reqVO);

    /**
     * 校验是否可以更新
     *
     * @param id   申请编号
     * @param reqVO 申请资料
     */
    void validateCanUpdate(Long id, SAVE reqVO);

    /**
     * 更新
     *
     * @param id   申请编号
     * @param reqVO 申请资料
     */
    void update(Long id, SAVE reqVO);

    /**
     * 获得店铺信息
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @return 店铺信息
     */
    @Nullable
    DO getDetailByUserId(Long userId, @Nullable Integer userType);

    /**
     * 检查加入情况
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @return 检查结果
     */
    EligibilityApplyCheckVO<RESP> check(Long userId, @Nullable Integer userType);

    /**
     * 申请加入
     *
     * @param userId   用户编号
     * @param userType 用户类型
     * @param reqVO 申请资料
     * @return 申请编号
     */
    Long apply(Long userId, @Nullable Integer userType, SAVE reqVO);

    /**
     * 更新审核信息
     *
     * @param reqVO 更新信息
     */
    void updateAudit(AuditSaveDTO reqVO);

    /**
     * 订单支付成功后更新用户身份资格
     *
     * @param tradeNo 交易单号
     * @param userId 用户编号
     * @param packageId 套餐编号
     */
    void updateWhenPaid(String tradeNo, Long userId, Long packageId);

}